package be.redtree.bean; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.io.Writer; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.UUID; import javax.faces.application.FacesMessage; import javax.faces.bean.ManagedBean; import javax.faces.bean.ViewScoped; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.persistence.Transient; import javax.portlet.PortletRequest; import org.apache.commons.io.output.ByteArrayOutputStream; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.joda.time.DateTime; import org.primefaces.component.dnd.Droppable; import org.primefaces.event.DragDropEvent; import org.primefaces.event.NodeSelectEvent; import org.primefaces.model.DefaultTreeNode; import org.primefaces.model.TreeNode; import be.redtree.initialize.DefaultValuesBuilder; import be.redtree.library.Library; import be.redtree.model.Document; import be.redtree.model.DocumentModel; import be.redtree.model.Field; import be.redtree.model.FieldResult; import be.redtree.model.Form; import be.redtree.model.FormResult; import be.redtree.model.MultiValue; import be.redtree.model.SingleValue; import be.redtree.sql.FormController; import com.csvreader.CsvWriter; import com.liferay.faces.portal.context.LiferayFacesContext; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.kernel.language.LanguageUtil; import com.liferay.portal.kernel.util.ListUtil; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.OrderByComparator; import com.liferay.portal.kernel.util.WebKeys; import com.liferay.portal.model.User; import com.liferay.portal.service.ServiceContext; import com.liferay.portal.service.UserLocalServiceUtil; import com.liferay.portal.theme.ThemeDisplay; import com.liferay.portlet.bookmarks.util.comparator.EntryNameComparator; import com.liferay.portlet.documentlibrary.model.DLFileEntry; import com.liferay.portlet.documentlibrary.model.DLFolder; import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil; import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil; import com.liferay.portlet.dynamicdatamapping.storage.Fields; @ManagedBean @ViewScoped public class WebFormControlBean implements Serializable { private static Log sLog = LogFactory.getLog(WebFormControlBean.class); private FormController formController = new FormController(); private static String MESSAGE_SAVED_SUCCESS = "be.redtree.form.message.save"; private static String MESSAGE_DELETE_SUCCESS = "be.redtree.form.message.delete"; private Integer tabIndex; private List<Field> availableFields; private Form form; private TreeNode root; private Document selectedTreeFolder; private DocumentModel files; private Document tempDocument; private List<Form> forms; private List<Form> templates; private Boolean displayResults; private List<Locale> locales; public WebFormControlBean() { this.tabIndex = 0; this.files = new DocumentModel(new ArrayList<Document>()); this.availableFields = new ArrayList<Field>(); this.locales = Arrays.asList(LanguageUtil.getAvailableLocales()); String uuid = null; SingleValue value = null; List<MultiValue> values = new ArrayList<MultiValue>(); Integer weight = 0; Boolean mandatory = false; String message = null; String title = null; String style = null; String tempValue = null; String css = null; Integer size = 0; String formats = null; availableFields.add(new Field(uuid, "text", null, value, values, weight, mandatory, message, title, style, css, tempValue, size, formats)); availableFields.add(new Field(uuid, "textfield", null, value, values, weight, mandatory, message, title, style, css, tempValue, size, formats)); availableFields.add(new Field(uuid, "textarea", null, value, values, weight, mandatory, message, title, style, css, tempValue, size, formats)); availableFields.add(new Field(uuid, "checkbox", null, value, values, weight, mandatory, message, title, style, css, tempValue, size, formats)); availableFields.add(new Field(uuid, "radio", null, value, values, weight, mandatory, message, title, style, css, tempValue, size, formats)); availableFields.add(new Field(uuid, "drop", null, value, values, weight, mandatory, message, title, style, css, tempValue, size, formats)); availableFields.add(new Field(uuid, "upload", null, value, values, weight, mandatory, message, title, style, css, tempValue, size, formats)); availableFields.add(new Field(uuid, "image", null, value, values, weight, mandatory, message, title, style, css, tempValue, size, formats)); Collections.sort(availableFields, fieldNameComparator); clearForm(); } public void initializeNewForm() { this.tabIndex = 2; this.displayResults = false; clearForm(); } public void editForm(Long id) { this.displayResults = true; loadForm(id); } public void editTemplate(Long id) { this.displayResults = false; loadForm(id); } public List<String> getUploadFormats(Field field) { List<String> formats = new ArrayList<String>(); if (field != null && field.getFormats() != null && !field.getFormats().isEmpty()) { String[] formats_ = field.getFormats().split("\\|"); for (String format : formats_) { formats.add(format); } } return formats; } public void addUploadFormat(Field field) { String format = field.getTempValue(); if (field != null && field.getFormats() != null && !field.getFormats().isEmpty()) { field.setFormats(field.getFormats() + "|" + format); } else { field.setFormats(format); } field.tempValue = null; } public String getLocaleTitle(Locale locale) { PortletRequest portletRequest = (PortletRequest) LiferayFacesContext.getCurrentInstance().getExternalContext().getRequest(); ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY); String language = locale.getDisplayLanguage(themeDisplay.getLocale()); String country = locale.getDisplayCountry(themeDisplay.getLocale()); return language + " (" + country + ")"; } private void loadForm(Long id) { this.tabIndex = 2; this.form = formController.getForm(id); } public void resultsForm(Long id) { this.tabIndex = 3; this.displayResults = true; this.form = formController.getForm(id); } public void deleteForm() { PortletRequest portletRequest = (PortletRequest) LiferayFacesContext.getCurrentInstance().getExternalContext().getRequest(); ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY); formController.deleteForm(this.form); clearForm(); FacesContext context = FacesContext.getCurrentInstance(); context.addMessage("growl", new FacesMessage(LanguageUtil.get(themeDisplay.getLocale(), MESSAGE_DELETE_SUCCESS), "")); } public void processForm(Long id) { this.form = formController.getForm(id); } public void saveTemplateForm() { Form form = Library.duplicateForm(this.form); form.setTemplate(false); this.displayResults = true; PortletRequest portletRequest = (PortletRequest) LiferayFacesContext.getCurrentInstance().getExternalContext().getRequest(); ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY); FacesContext context = FacesContext.getCurrentInstance(); context.addMessage("growl", new FacesMessage(LanguageUtil.get(themeDisplay.getLocale(), MESSAGE_SAVED_SUCCESS), "")); } public void saveTemplate() { PortletRequest portletRequest = (PortletRequest) LiferayFacesContext.getCurrentInstance().getExternalContext().getRequest(); ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY); this.displayResults = false; Boolean template = true; if (form.getId() == null) { createNewForm(template); } else { if (!form.getTemplate()) { Form form = Library.duplicateForm(this.form); form.setTemplate(true); Long id = formController.addForm(form); this.form = formController.getForm(id); } else { form.setTemplate(template); formController.editForm(form); } } FacesContext context = FacesContext.getCurrentInstance(); context.addMessage("growl", new FacesMessage(LanguageUtil.get(themeDisplay.getLocale(), MESSAGE_SAVED_SUCCESS), "")); } public void saveForm() { PortletRequest portletRequest = (PortletRequest) LiferayFacesContext.getCurrentInstance().getExternalContext().getRequest(); ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY); Boolean template = false; if (this.form.getId() == null) { createNewForm(template); this.displayResults = false; } else { formController.editForm(form); if (!form.getTemplate()) { this.displayResults = true; } } this.form = formController.getForm(form.getId()); FacesContext context = FacesContext.getCurrentInstance(); context.addMessage("growl", new FacesMessage(LanguageUtil.get(themeDisplay.getLocale(), MESSAGE_SAVED_SUCCESS), "")); } private void createNewForm(Boolean template) { formController.addForm(form); } public void downloadResults(Long formId) throws IOException, PortalException, SystemException { ByteArrayOutputStream out = new ByteArrayOutputStream(); Writer writer = new OutputStreamWriter(out); char separator = ';'; CsvWriter csvWriter = new CsvWriter(writer, separator); int offset = 2; Form form = formController.getForm(formId); List<Field> fields = new ArrayList<Field>(form.getFields()); Collections.sort(fields, Form.fieldWeightComparator); List<FormResult> formResults = formController.getFormResults(formId); String[] header = new String[fields.size() + offset]; header[0] = "screename"; header[1] = "creation"; int y = offset; for (Field field : fields) { header[y] = field.getName(); y++; } csvWriter.writeRecord(header); for (FormResult formResult : formResults) { // Users String[] values = new String[fields.size() + offset]; values[0] = "0"; if (!formResult.getUserId().equals(new Long(0))) { User user = null; try { user = UserLocalServiceUtil.getUser(formResult.getUserId()); values[0] = user.getScreenName(); } catch (PortalException e) { e.printStackTrace(); } catch (SystemException e) { e.printStackTrace(); } } // Date DateTime dateTime = new DateTime(formResult.getCreated()); values[1] = dateTime.getDayOfMonth() + "/" + dateTime.getMonthOfYear() + "/" + dateTime.getYear() + " " + dateTime.getHourOfDay() + ":" + dateTime.getMinuteOfHour() + ":" + dateTime.getSecondOfMinute(); int x = offset; for (Field field : fields) { String content = ""; if (field.getName().equals("text")) { content = field.getValue().getContent(); } else { for (FieldResult fieldResult : formResult.getFields()) { if (field.getId().equals(fieldResult.getFieldId())) { content = fieldResult.getContent(); } } } values[x] = content; x++; } csvWriter.writeRecord(values); } csvWriter.close(); PortletRequest portletRequest = (PortletRequest) LiferayFacesContext.getCurrentInstance().getExternalContext().getRequest(); ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY); Long groupId = themeDisplay.getCompany().getGroup().getGroupId(); DLFolder dlFolder = DLFolderLocalServiceUtil.getFolder(groupId, new Long(0), DefaultValuesBuilder.FOLDER_DOWNLOAD); DateTime dateTime = new DateTime(); ServiceContext serviceContext = new ServiceContext(); Long userId = themeDisplay.getCompany().getDefaultUser().getUserId(); long repositoryId = groupId; long folderId = dlFolder.getFolderId(); String sourceFileName = "webform_export_" + dateTime.getDayOfMonth() + "-" + dateTime.getMonthOfYear() + "-" + dateTime.getYear() + "_" + dateTime.getMillis() + ".csv"; String mimeType = "application/csv"; String title = sourceFileName; String description = ""; String changeLog = ""; long fileEntryTypeId = new Long(0); Map<String, Fields> fieldsMap = new HashMap<String, Fields>(); File file = null; InputStream is = new ByteArrayInputStream(out.toByteArray()); long size = out.toByteArray().length; DLFileEntry dlFileEntry = DLFileEntryLocalServiceUtil.addFileEntry(userId, groupId, repositoryId, folderId, sourceFileName, mimeType, title, description, changeLog, fileEntryTypeId, fieldsMap, file, is, size, serviceContext); String url = "/../documents/" + groupId + "/" + folderId + "/" + URLEncoder.encode(dlFileEntry.getName(), "UTF-8") + "/" + dlFileEntry.getUuid(); FacesContext.getCurrentInstance().getExternalContext().redirect(url); } public void clearForm() { PortletRequest portletRequest = (PortletRequest) LiferayFacesContext.getCurrentInstance().getExternalContext().getRequest(); ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY); Long companyId = themeDisplay.getCompanyId(); String name = ""; Boolean template = false; Boolean allowGuest = false; Boolean accessResults = false; Boolean allowMultiple = false; Boolean userCopy = false; Boolean userinfo = false; Boolean anonymous = false; Boolean sendMail = false; String email = ""; List<Field> fields = new ArrayList<Field>(); Locale locale = LocaleUtil.getDefault(); form = new Form(companyId, locale, name, template, allowGuest, accessResults, allowMultiple, userCopy, userinfo, anonymous, sendMail, email, fields); } public void moveUpOption(Field field, String idRadio) { List<MultiValue> values = new ArrayList<MultiValue>(field.getValues()); Set<MultiValue> valuesTemp = new HashSet<MultiValue>(); for (MultiValue option : values) { if (option.getName().equals(idRadio)) { int weight = option.getWeight(); if (weight > 0) { weight--; } option.setWeight(weight); } valuesTemp.add(option); } field.setValues(valuesTemp); } public void moveDownOption(Field field, String idRadio) { List<MultiValue> values = new ArrayList<MultiValue>(field.getValues()); Set<MultiValue> valuesTemp = new HashSet<MultiValue>(); for (MultiValue option : values) { if (option.getName().equals(idRadio)) { int weight = option.getWeight(); weight++; option.setWeight(weight); } valuesTemp.add(option); } field.setValues(valuesTemp); } public void removeOption(Field field, String idRadio) { List<MultiValue> list = new ArrayList<MultiValue>(); for (MultiValue value : field.getValues()) { if (!value.getName().equals(idRadio)) { list.add(value); } } field.setValues(new HashSet<MultiValue>(list)); } public void addOptionValue(Field field) { List<MultiValue> values = new ArrayList<MultiValue>(); if (field.getValues() != null) { values = new ArrayList<MultiValue>(field.getValues()); } MultiValue multiValue = new MultiValue(UUID.randomUUID().toString(), 0, field.tempValue, false, field); values.add(multiValue); field.tempValue = null; field.setValues(new HashSet<MultiValue>(values)); } public String getLocalContent(Field field, MultiValue multiValue) { String json = multiValue.getContent(); Map<String, String> values = Library.getJsonMapping(json); String locale_ = field.getLocaleValue().toString(); String value = values.get(locale_); if (value == null) { return ""; } return value; } public void removeField(String id) { List<Field> tempavailableFields = new ArrayList<Field>(); for (Field field : this.form.getFields()) { if (!field.getUuid().equals(id)) { tempavailableFields.add(field); } } this.form.setSelectedFields(tempavailableFields); } public void usePreviewImage(Field field) throws NumberFormatException, PortalException, SystemException, UnsupportedEncodingException { DLFileEntry dlFileEntry = DLFileEntryLocalServiceUtil.getDLFileEntry(new Long(this.tempDocument.getId())); String url = "/../documents/" + dlFileEntry.getGroupId() + "/" + dlFileEntry.getFolderId() + "/" + URLEncoder.encode(dlFileEntry.getTitle(), "UTF-8") + "/" + dlFileEntry.getUuid(); field.getValue().setContent(url); } public void onFieldSort() { FacesContext context = LiferayFacesContext.getCurrentInstance(); String ids_ = (String) context.getExternalContext().getRequestParameterMap().get("ids"); if (ids_ != null) { String[] ids = ids_.split("\\|"); List<Field> tempavailableFields = new ArrayList<Field>(); for (String id : ids) { for (Field field : this.form.getFields()) { if (field.getUuid().equals(id)) { tempavailableFields.add(field); } } } int x = 0; for (Field field : tempavailableFields) { field.setWeight(x++); } this.form.setSelectedFields(tempavailableFields); } } public void onFieldDrop(DragDropEvent ddEvent) { Droppable source = (Droppable) ddEvent.getSource(); String dataSource = source.getDatasource(); String dragId = ddEvent.getDragId(); if (dragId.contains(dataSource)) { Field tempField = (Field) ddEvent.getData(); String uuid = UUID.randomUUID().toString(); String name = tempField.getName(); SingleValue value = null; String title = ""; List<MultiValue> values = new ArrayList<MultiValue>(); Integer weight = this.form.getSelectedFields().size() + 1; Boolean mandatory = tempField.getMandatory(); String message = tempField.getMessage(); String style = tempField.getStyle(); String tempValue = ""; String css = ""; Integer size = 3000; String formats = "gif|jpeg|png"; Field field = new Field(uuid, name, form, value, values, weight, mandatory, message, title, style, css, tempValue, size, formats); field.setValue(new SingleValue("", 0, "", false, field)); this.form.getFields().add(field); } } public List<Field> getavailableFields() { return availableFields; } public void setavailableFields(List<Field> availableFields) { this.availableFields = availableFields; } public String getDialogId(String uuid) { uuid = uuid.replaceAll("\\-", ""); return "dialog_" + uuid; } public String getColumnId(String uuid) { uuid = uuid.replaceAll("\\-", ""); return "column_" + uuid; } public List<Form> getForms() { PortletRequest portletRequest = (PortletRequest) LiferayFacesContext.getCurrentInstance().getExternalContext().getRequest(); ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY); this.forms = formController.getForms(themeDisplay.getCompanyId(), false); return this.forms; } public List<Form> getTemplates() { PortletRequest portletRequest = (PortletRequest) LiferayFacesContext.getCurrentInstance().getExternalContext().getRequest(); ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY); this.templates = formController.getForms(themeDisplay.getCompanyId(), true); return templates; } public void setTemplates(List<Form> templates) { this.templates = templates; } public void setForms(List<Form> forms) { this.forms = forms; } public Integer getTabIndex() { return tabIndex; } public void setTabIndex(Integer tabIndex) { this.tabIndex = tabIndex; } public List<Field> getselectedFields() { List<Field> fields = new ArrayList<Field>(this.form.getFields()); if (!fields.isEmpty()) { Collections.sort(fields, Form.fieldWeightComparator); } return fields; } public TreeNode getRoot() { if (this.root != null) { return this.root; } PortletRequest portletRequest = (PortletRequest) LiferayFacesContext.getCurrentInstance().getExternalContext().getRequest(); ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY); Long groupId = themeDisplay.getScopeGroupId(); Long folderId = new Long(0); TreeNode treeNode = new DefaultTreeNode("root", null); buildTree(groupId, folderId, treeNode); this.root = treeNode; return root; } private void buildTree(Long groupId, Long folderId, TreeNode treeNode) { List<DLFolder> folders = new ArrayList<DLFolder>(); try { folders = DLFolderLocalServiceUtil.getFolders(groupId, folderId); } catch (SystemException e) { e.printStackTrace(); } for (DLFolder dlFolder : folders) { try { TreeNode folderNode = new DefaultTreeNode(new Document("" + dlFolder.getFolderId(), dlFolder.getName(), "folder"), treeNode); buildTree(groupId, dlFolder.getFolderId(), folderNode); } catch (Exception e) { e.printStackTrace(); } } } public String getLocaleId() { UIComponent component = UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()); String name = component.toString(); while (!name.startsWith("org.primefaces.component.panelgrid.PanelGrid")) { component = component.getParent(); if (component == null) { return null; } name = component.toString(); } return component.getId(); } public void setRoot(TreeNode root) { this.root = root; } public void onNodeTreeSelect(NodeSelectEvent event) { Document document = (Document) event.getTreeNode().getData(); this.selectedTreeFolder = document; } public Document getSelectedTreeFolder() { return selectedTreeFolder; } public void setSelectedTreeFolder(Document selectedTreeFolder) { this.selectedTreeFolder = selectedTreeFolder; } public DocumentModel getFiles() throws SystemException, NumberFormatException, PortalException { List<Document> documents = new ArrayList<Document>(); List<DLFileEntry> dlFileEntries = new ArrayList<DLFileEntry>(); OrderByComparator obc = new EntryNameComparator(); if (this.selectedTreeFolder != null) { DLFolder dlFolder = DLFolderLocalServiceUtil.getDLFolder(new Long(this.selectedTreeFolder.getId())); dlFileEntries = ListUtil.copy(DLFileEntryLocalServiceUtil.getFileEntries(dlFolder.getGroupId(), dlFolder.getFolderId(), -1, -1, obc)); } else { PortletRequest portletRequest = (PortletRequest) LiferayFacesContext.getCurrentInstance().getExternalContext().getRequest(); ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY); dlFileEntries = ListUtil.copy(DLFileEntryLocalServiceUtil.getFileEntries(themeDisplay.getScopeGroupId(), new Long(0), -1, -1, obc)); } for (DLFileEntry dlFileEntry : dlFileEntries) { documents.add(new Document("" + dlFileEntry.getFileEntryId(), dlFileEntry.getTitle(), dlFileEntry.getExtension())); } this.files = new DocumentModel(documents); return files; } public void setFiles(DocumentModel files) { this.files = files; } public Document getTempDocument() { return tempDocument; } public void setTempDocument(Document tempDocument) { this.tempDocument = tempDocument; } public Boolean getDisplayResults() { return displayResults; } public void setDisplayResults(Boolean displayResults) { this.displayResults = displayResults; } public List<Locale> getLocales() { return locales; } public void setLocales(List<Locale> locales) { this.locales = locales; } public Form getForm() { return form; } public void setForm(Form form) { this.form = form; } /* * SORTING */ @Transient public static Comparator<Field> fieldNameComparator = new Comparator<Field>() { public int compare(Field f1, Field f2) { return f1.getName().compareTo(f2.getName()); } }; }